//
//  CZUserAccountViewModel.swift
//  微博08
//
//  Created by apple on 16/2/27.
//  Copyright © 2016年 itcast. All rights reserved.
//

import UIKit

class CZUserAccountViewModel: NSObject {
    
    // MARK: - 属性
    // 单例
    static let sharedInstance: CZUserAccountViewModel = CZUserAccountViewModel()
    
    // 用户账户,通过单例可以全局访问
    var userAccount: CZUserAccount?
    
    // 用户是否登录
    var userLogin: Bool {
        get {
            return userAccount != nil
        }
    }
    
    // 归档路径
    let accountPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last!.stringByAppendingString("/Account.plist")

    // MARK: - 方法
    // 当单例第一次访问的时候回去沙盒里面解档账户
    private override init() {
        super.init()
        
        userAccount = loadUserAccount()
    }
    
    // 3.1 调用CZUserAccountViewModel的方法去加载请求
    func loadAccessToken(code: String, loadAccessTokenCallBack: (error: NSError?) -> ()) {
        // 3.2 使用CZNetworkTool发起请求获取AccessToken,并且准备闭包
        CZNetworkTool.sharedInstance.loadAccessToken(code, accessTokenFinished: { (response, var error) -> () in
            // 3.7判断请求是否失败
            // 模拟失败
//            error = NSError(domain: "1", code: 1, userInfo: nil)
            if response == nil || error != nil {
                loadAccessTokenCallBack(error: error)
                return
            }
            
            // 获取access token 成功
            print("获取access token 成功 response: \(response)")
            
            // 3.8 字典转模型,并且赋值给属性
            self.userAccount = CZUserAccount(dict: response!)
            
            // 3.9 将模型保存到沙盒里面
            self.saveUserAccount()
            
            // 回调:获取AccessToken没有有出错
            loadAccessTokenCallBack(error: nil)
        })
    }
    
    // 将对象保存到沙盒
    private func saveUserAccount() {
        if userAccount != nil {
            print("accountPath: \(accountPath)")
            NSKeyedArchiver.archiveRootObject(userAccount!, toFile: accountPath)
        }
    }
    
    // 将CZUserAccount从沙盒里面解档出来
    private func loadUserAccount() -> CZUserAccount? {
        let account = NSKeyedUnarchiver.unarchiveObjectWithFile(accountPath) as? CZUserAccount
        
        // 还要判断accessToken是否过期,如果过期了,说明AccessToken是没有用的,就不返回这个过期的账号
        // 过期时间: account?.expiresDate  2021-02-27 02:26:20 +0000
        // 当前时间: NSDate() 2016-02-29 02:31:08 +0000
        // 过期时间比当前时间大表示没有过去 >
        // 测试过期的情况
//        account?.expiresDate = NSDate(timeIntervalSinceNow: -100)
        if account != nil && account?.expiresDate?.compare(NSDate()) == NSComparisonResult.OrderedDescending {
            print("账号没有过期: \(account?.expiresDate)")
            return account
        } else {
            return nil
        }
    }
    
    func loadUserInfo(loadUserInfoCallBack: (error: NSError?) -> ()) {
        // 2.调用网络工具类的loadUserInfo,又准备了一个闭包
        CZNetworkTool.sharedInstance.loadUserInfo { (result, error) -> () in
            
            // 9.判断错误
            if error != nil {
                loadUserInfoCallBack(error: error)
                return
            }
            
            // 10.获取数据
            self.userAccount?.screen_name = result?["screen_name"] as? String
            self.userAccount?.avatar_large = result?["avatar_large"] as? String
            
            // 11.保存起来
            self.saveUserAccount()
            
            // 12.执行闭包
            loadUserInfoCallBack(error: nil)
        }
    }
}
